package com.coder;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Collections;

/**
 * 代码生成器测试类
 * 用于根据数据库表结构自动生成对应的Java代码文件，包括实体类、Mapper接口、Service层、Controller层等
 */
@SpringBootTest
public class GeneratorCode {
    /**
     * 代码作者信息
     */
    private static final String AUTHOR="tuboyuan";

    /**
     * 数据库连接URL
     */
    private static final String JDBC_URL="jdbc:mysql://localhost:3306/auto_rental";

    /**
     * 数据库用户名
     */
    private static final String JDBC_USERNAME="root";

    /**
     * 数据库密码
     */
    private static final String JDBC_PASSWORD="root";

    /**
     * 代码生成输出目录
     */
    private static final String OUT_DIR=".\\src\\main\\java";

    /**
     * 生成代码的包名
     */
    private static final String PACKAGE_NAME="com.coder";

    /**
     * 生成代码的模块名
     */
    private static final String MODULE_NAME="rental";

    /**
     * 需要生成代码的数据库表名数组
     */
    private static final String[] TABLES={
            "auto_maker","auto_brand","auto_info",
            "sys_dept","sys_permission","sys_role","sys_user","sys_role_permission","sys_user_role",
            "busi_customer","busi_maintain","busi_violation","busi_order","busi_rental_type"
    };

    /**
     * 需要移除的表名前缀数组
     */
    private static final String[] PREFIX={"busi_","sys_"};

    /**
     * 执行代码生成操作
     * 通过FastAutoGenerator工具根据配置的数据库信息和生成策略，自动生成完整的代码结构
     */
    @Test
    public void generateCode() {
        // 创建代码生成器实例，并配置数据库连接信息
        FastAutoGenerator.create(JDBC_URL, JDBC_USERNAME, JDBC_PASSWORD)
                .globalConfig(builder -> builder
                        .author(AUTHOR)
                        .enableSwagger()
                        .outputDir(OUT_DIR)
                )
                .packageConfig(builder -> {
                    builder.parent(PACKAGE_NAME)
                            .moduleName(MODULE_NAME)
                            .pathInfo(Collections.singletonMap(OutputFile.xml, ".\\src\\main\\resources\\mapper"));
                })
                .strategyConfig(builder -> {
                    builder.addInclude(TABLES)
                            .addTablePrefix(PREFIX)
                            .entityBuilder()
                            .enableLombok()
                            .enableChainModel()
                            .controllerBuilder()
                            .enableRestStyle();
                })
                .templateEngine(new FreemarkerTemplateEngine())
                .execute();
    }
}

